Chapter 18: Exercises

選擇題


簡答題

  1. 請列舉三點,說明將網頁資料儲存於資料庫的好處。
  2. 要讓 ASP 程式碼和資料庫溝通,首先要知道資料庫所在位置以及其相關資訊,有兩種方法可以達成此任務,請簡單說明,並解釋這兩個方法的優缺點。
  3. ODBC 的全名為何?意義為何?
  4. SQL 的全名為何?此程式語言的功能與特性?
  5. 在 Access 資料庫中,text 欄位和 memo 欄位有什麼重要差異?
  6. 在 Access 軟體內執行 SQL 指令時,如何比對一個字元?如何比對多個字元?
  7. 在 ASP 程式碼內執行 SQL 指令時,如何比對一個字元?如何比對多個字元?
  8. 有關於「資料隱碼」(SQL Injection):
    1. 請簡單說明(不超過五句)什麼是「資料隱碼」?
    2. 請簡單說明(不超過五句)如何避免這個問題?
  9. 對於一般的帳號密碼認證,如何使用資料隱碼的方式來進行駭客任務?
  10. 假設有一個資料庫包含兩個資料表:
    • Player 包含球員的資料,其中 TeamID 是球員所隸屬的籃球隊代號(載明在 Team 資料表),Percentage 是投籃的命中率。
    • Team 包含籃球隊的資料,其中 WinNo 是本季的贏球次數。
    相關內容如下:
    資料庫 "example/database/basketball.mdb"
    資料表 "Player" 的內容 資料表 "Team" 的內容
    ID NickName Name TeamID Percentage
    jean 吳志銘 38.25 
    jones 張秤嘉 49.77 
    ben 陳孜彬 50.26 
    asser 林惠娟 37.22 
    window 李宜揚 36.67 
    roger 張智星 25.88 
    cosh 許文豪 70.98 
    banny 洪鵬翔 88.97 
    shyba 邱中人 67.45 
    10 batty 楊璧如 65.55 
    11 joey 許嘉晉 47.65 
    12 roland 吳瑞千 55.87 
    13 sony 林頌華 54.77 
    14 beball 葉佳慧 33.33 
    15 gavins 林政源 55.65 
    16 jojo 陳俊傑 44.65 
    17 jtchen 陳江村 48.76 
    18 Gao 高名揚 67.88 
    19 Wayne 陳智偉 65.87 
    20 chingz 陳晴 57.28 
    ID Name WinNo
    台北隊 12 
    新竹隊 
    台中隊 10 
    南投隊 12 
    台南隊 17 
    高雄隊 16 
    澎湖隊 11 

    請根據此資料庫寫出符合下列需求的最簡單 SQL 指令:

    1. 所有球隊資料
    2. 所有球隊資料,但只抓前三筆
    3. 綽號為 gavins 的球員姓名及命中率
    4. 隊名以「台」開頭的球隊資料
    5. 「姓陳且名字有三個字」的球員姓名及命中率
    6. 「勝場數大於10」的球隊名稱及其勝場數
    7. 「勝場數大於10」的球隊名稱及其勝場數,並根據勝場數由大到小排列
    8. 「球隊代碼為5」的球員命中率排行榜
    9. 每一隊的球員命中率排行榜
    10. 「勝場數大於10」的球隊總數
    11. 所有球員的最高命中率
    12. 具有最高命中率的球員資料
    13. 每個球隊的球員人數及平均命中率
    14. 每個球隊的球員人數,但只顯示球員人數大於 2 位的資料
    15. 台北隊的球員資料
    16. 高雄隊和台中隊的射手排行榜
    17. 每個球隊的相關統計數字
  11. 假設我們有一個資料庫,內含三個資料表,他們的關聯圖如下:

    請寫出最簡潔的 SQL 指令,以執行以下查詢。

    1. 列出所有的國語歌曲
    2. 所有歌曲共包含哪幾種不同語言(不可重複)
    3. 歌曲共包含幾種不同語言
    4. 唱過台語歌的歌星(不可重複)

程式題

請使用本章所學到的 JavaScript/JScript 程式技巧(用於伺服器端)來完成下列作業:
  1. (***) 利用SQL從資料庫抓資料: 本題作業的目的,是讓同學熟悉 Access 資料庫的使用以及 SQL 的語法,並將 SQL 命令所回傳的資料顯現在網頁上。所用到的資料庫是 example/databsae/song.mdb,共包含三個資料表 (Singer, Song, Midi), 表和表之間有關聯性存在,此關聯性可由「工具/資料庫關聯圖」來顯示。 每個表的欄位名稱應可望文生義, 其中 SSN 代表 System Serial Number,是每筆資料在資料表中獨一無二的編號。你的工作,就是產生一個網頁 selectQuery01.asp,包含下列連結,當使用者點選某一個連結時,你的程式碼就會自動從資料庫中取出下列資料,並顯示在另一個網頁上。
    1. 歌曲共包含哪幾種不同語言
    2. 唱過台語歌的歌星
    3. 伍佰所唱的台語歌
    4. 伍佰所唱的國語歌的總數
    5. 唱過台語歌曲的女藝人及所唱的台語歌
    6. 張宇所唱的國語歌及其 Midi 檔案的路徑
    7. 張宇所唱的國語歌的 Midi 檔案的總數
    8. 歌曲共包含幾種不同語言
    9. Song 中重複的歌名
    10. 有歌名卻沒有 Midi 檔的歌曲資料(提示:此題會用到 Outer Join)
    11. 歌曲中有『愛』、『恨』者 SELECT Song.Name FROM Song WHERE (Song.Name Like '%愛%') Or (Song.Name Like '%恨%');
    12. 未收錄任何歌曲之團體(需用到 left/right join) SELECT Singer.Name FROM Singer LEFT JOIN Song ON Singer.SSN = Song.SingerSSN WHERE (Singer.Type='團體') AND (Song.SSN Is Null);
    13. 歌曲名有英文字之歌曲資料,及其對應的歌手 SELECT Song.Name, Singer.Name FROM Singer, Song WHERE (Song.SingerSSN=Singer.SSN) AND (Song.Name Like '%[a-zA-Z]%');
    14. 歌曲名稱是四個字的歌曲,及其對應的歌手 SELECT Song.Name, Singer.Name FROM Song, Singer WHERE (Singer.SSN=Song.SingerSSN) AND (Song.Name Like '____');
    15. 歌手及唱過的歌曲數(請按照唱過的歌曲數排名) SELECT Singer.Name, Count(*) AS 唱過的歌曲數 FROM Song, Singer WHERE (Singer.SSN=Song.SingerSSN) GROUP BY Singer.Name ORDER BY Count(*) DESC;
    16. 每位歌手分別在各種語言中唱過幾首歌 SELECT Singer.Name, Song.Language, Count(*) AS 歌曲數 FROM (SELECT Singer.Name, Song.Language FROM Song, Singer WHERE Song.SingerSSN = Singer.SSN) GROUP BY Singer.Name, Song.Language;
    17. 雙聲帶歌手(有唱兩種語言以上的歌手) SELECT 姓名, count(*) as 語言數量 FROM (SELECT Singer.Name as 姓名, Song.Language as 語言 FROM Singer,Song where(Song.SingerSSN=Singer.SSN) GROUP BY Singer.Name, Song.Language) GROUP BY 姓名 HAVING count(*)>1
    18. 團體歌手及唱過的歌曲數(請按照唱過的歌曲數排名) SELECT singer.Name, Count(*) AS 歌曲數目 FROM singer, song WHERE (singer.SSN=song.SingerSSN) AND (singer.Type='團體') GROUP BY singer.Name ORDER BY Count(*) DESC;
    19. 以"愛"開頭的國語歌 SELECT Song.Name AS 歌名, Singer.Name AS 歌手 FROM Song, Singer WHERE (Song.SingerSSN=Singer.SSN) AND (Song.Name Like '愛*') AND (Song.Language='國語');
    20. 依語言、種類、男女來分類的各項歌曲數目 SELECT Song.Language, Singer.Type, Singer.Gender, Count(*) AS 歌曲總數 FROM Singer INNER JOIN Song ON Singer.SSN = Song.SingerSSN GROUP BY Song.Language, Singer.Type, Singer.Gender;
    21. MIDI版本最多的歌曲 SELECT TOP 1 Song.Name AS 版本最多的歌曲 FROM Song INNER JOIN Midi ON Song.SSN = Midi.SongSSN GROUP BY Song.Name HAVING (((Count(*))>1)) ORDER BY Count(*) DESC;
    22. 一曲歌手 SELECT Singer.Name FROM Singer INNER JOIN Song ON Singer.SSN = Song.SingerSSN GROUP BY Singer.Name HAVING (Count(Song.Name)=1);
    23. 姓名為兩個字的歌手 select distinct name from singer where name like '__'
    注意事項:
    • 可以使用 listQueryResult() 函數來進行資料列表。
    • 資料庫中「查詢」的部份,包含前三小題作業要用到的 SQL 命令,同學可參考之。
    • 所有的作業,都可以經由 SQL 命令來取出所要的資訊。
    • 我們用的資料庫是 Office 2000 中的 Access,如果你還在用 Office 97,那就該升級了。
    • 助教在測試你的程式時,會以另一個資料庫(欄位相同但資料不同)來進行測試。
  2. (***) 設計有用的查詢: 如果你做過上一題,應該就會對 SQL 指令及 example/databsae/song.mdb 資料庫有基本的瞭解。請延續上題的查詢及相關的 SQL 指令,創造出五個更複雜且「有意義」的查詢,並將此查詢的中文意義及相關的 SQL 指令列在一個 ASP 網頁 selectQuery02.asp,當使用者點選時,可將查詢結果顯示在另一個新開啟的視窗。(本題並沒有標準答案,請各位盡量發揮創意!)
  3. (***) SQL 語法在 MS Access 與 MS SQL Server 的差異: 雖然說 SQL 是一個標準化的資料庫程式語言,但是在不同的軟體,也會有些差異。本作業麻煩各位同學到 Google 大師搜尋一下,比較看看 SQL 語法在 MS Access 與 MS SQL Server 這兩個資料庫軟體的差異,並以列表方式,逐一說明其差異所在及可能造成的影響。
  4. (***) 以資料庫設計留言版: 本作業之目的是讓同學更進一步瞭解 ASP 與資料庫的整合,並能對資料庫的資料進行各種處理,含列表及新增。本作業的成品是一個 Web 留言版,你必須從讀者(或伺服器)取得下列資訊,並將之顯示在你的留言版:
    • 由使用者輸入:
      • 貴姓大名
      • 性別
      • 伊媚兒
      • 個人網址
      • 留言內容

    • 由 ASP 程式碼自動抓取:
      • 登錄時間和日期
      • 訪客 IP (是真正的 IP,而非代理伺服器的 IP,可由 Request.ServerVariables("REMOTE_ADDR")Request.ServerVariables("HTTP_X_FORWARDED_FOR") 來取得。)
      • 訪客所用的瀏覽器 (由 Request.ServerVariables("HTTP_USER_AGENT"))
      • 來源網頁 (由 Request.ServerVariables("HTTP_REFERER"))

    注意事項:

    • 本次作業需用 ASP 完成(你可以任選 JScript 或 VBScript 或 PerlScript),但不可以使用 CGI 來完成。
    • 留言版資料必須存在資料庫之中,網頁必須具備「新增」及「列表」的功能。
    • 必須防範別人留下一些亂七八糟的標籤,造成網頁格式的混亂。(可使用 Server.HTMLEncode() 函數。)
    • 不須要對姓名及留言進行基本的表單驗證。
    • 我相信你可以在網路上找到很多相關範例及原始碼。這裡是一個不完全的範例:
      • 這裡有一個半成品,請多加利用,並歡迎測試!
      • 所有的程式碼都放在 guestBook.zip,請多加抄襲!
  5. (***) 以資料庫設計留言版之二: 除了滿足前一題的要求外,你的網頁還需要具備下列功能:
    1. 加上留言管理功能:可讓管理員不需開啟資料庫,直接經由網頁輸入密碼後,即可有「修改」及「刪除」的權限。(進行修改時,必須把原資料列出在表單之中。)
    2. 自動分頁功能,當留言數量龐大時,可允許使用者選擇使用分頁功能來瀏覽留言, 並可允許使用者設定每一頁留言的數目。
    3. 加入搜尋功能,允許使用者找出含有搜尋字串的留言資料。為簡化起見,可以只使用一個搜尋字串,尋找所有的欄位。(為便於察看結果,建議在回傳內容中將符合的字串變色。)
    4. 利用 cookie 功能記錄使用者留言時所登錄的基本資料, 並於下次使用者欲留言時,由系統預先將資料放置於 input 欄位中。
  6. (***) 以資料庫設計線上通訊錄: 本作業之目的是讓同學更進一步瞭解 ASP 與資料庫的整合,並能對資料庫的資料進行各種處理,含查詢、新增、修改、刪除。 本作業的成品是一個 Web 的個人通訊錄,你必須從使用者(應該就是你自己)取得下列資訊,存入資料庫,並將之顯示在你的通訊錄:
    • 由使用者輸入的聯絡人資訊:
      • 貴姓大名
      • 性別
      • 伊媚兒
      • 網址
      • 電話
      • 大哥大
      • 地址
      • 類別(例如高中同學、親戚、社團同學等)

    • 由 ASP 程式碼自動抓取:
      • 登錄時間和日期
      • 訪客 IP (是真正的 IP,而非代理伺服器的 IP,可由 Request.ServerVariables("REMOTE_ADDR")Request.ServerVariables("HTTP_X_FORWARDED_FOR") 來取得。)
      • 訪客所用的瀏覽器 (由 Request.ServerVariables("HTTP_USER_AGENT"))
      • 來源網頁 (由 Request.ServerVariables("HTTP_REFERER"))

    請注意:

    • 本次作業需用 ASP 完成(你可以任選 JScript 或 VBScript 或 PerlScript),但不可以使用 CGI 來完成。
    • 無論顯示或修改通訊錄等,都需經過密碼認證。
    • 必須具有四大功能:列表、新增、修改、刪除。(進行修改時,必須把原資料列出在表單之中。)
    • 不需要進行表格驗證。(自己輸入的東西,自己負責就可以了!)
    • 我相信你可以在網路上找到很多相關範例及原始碼。這裡是留言版的範例,其功能和個人通訊錄非常接近:
      • 這裡有一個半成品,請多加利用,並歡迎測試!
      • 所有的程式碼都放在 guestBook.zip,請多加抄襲!
  7. (***) 以資料庫設計線上通訊錄之二: 除了滿足前一題的要求外,你的網頁還需要具備下列功能:
    • 分頁功能::當通訊錄資料數量龐大時,可允許使用者選擇使用分頁功能來瀏覽留言。
    • 排序功能:可根據不同的欄位(如類別、性別、姓名等)來進行排序顯示。
    • 搜尋功能:允許使用者根據不同欄位來進行搜尋。

JScript 程式設計與應用:用於伺服器端的 ASP 環境